﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Entities;
using LogicaNegocio;
using System.Web.Security;
namespace Presentacion
{
    public partial class ABMClientes : System.Web.UI.Page
    {
        private GestorTipoDocumentos gTipoDocumento;
        private GestorProvincias gProvincias;
        private GestorDepartamentos gDepartamentos;
        private GestorLocalidades gLocalidades;
        private GestorBarrios gBarrios;
        private GestorClientes gClientes;
        private GestorDomicilios gDomicilios;
        private GestorSeguridad gSeguridad;
        private static string op;
        private bool validarRolUsuario()
        {
            gSeguridad = new GestorSeguridad();
            string[] lstroles = gSeguridad.ObtenerRoles(HttpContext.Current.User.Identity.Name.ToString()).Split('|');
            if (lstroles != null && lstroles.Length > 0)
            {
                foreach (string item in lstroles)
                {
                    if (item=="Admin" || item=="Usuario" || item=="SuperUser")
                    {
                        return true;
                    }
                }
            }
            return false;
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                if (!validarRolUsuario())
                {
                    Response.Redirect("~/AccesoNoAutorizado.aspx");
                }
                else
                {
                    CargarTipoDocumento();
                    CargarProvincias();
                    op = Request.QueryString["op"].ToString();
                    Habilitar(op);
                }
                
            }
        }
        private void CargarTipoDocumento()
        {
            try
            {
                gTipoDocumento = new GestorTipoDocumentos();
                ddlTipoDocumento.DataSource = gTipoDocumento.ObtenerTodos();
                ddlTipoDocumento.DataTextField = "nombre";
                ddlTipoDocumento.DataValueField = "idTipoDoc";
                ddlTipoDocumento.DataBind();
                ddlTipoDocumento.Items.Insert(0, new ListItem("<Seleccione un Item>", "0"));
                if (ddlTipoDocumento.Items.Count == 0)
                {
                    ddlTipoDocumento.DataSource = null;
                    ddlTipoDocumento.Items.Clear();
                }
            }
            catch (Exception ex)
            {
                lblError.Text = "Hubo un problema al cargar los tipos de documentos";
                lblMensajeError.Text = ex.Message;
                //Console.Write("ERROR: " + ex.Message);
            }
        }
        private void CargarProvincias()
        {
            try
            {
                gProvincias = new GestorProvincias();
                ddlProvincia.DataSource = gProvincias.ObtenerTodos();
                ddlProvincia.DataTextField = "nombre";
                ddlProvincia.DataValueField = "idProvincia";
                ddlProvincia.DataBind();
                ddlProvincia.Items.Insert(0, new ListItem("<Seleccione un Item>", "0"));
                if (ddlProvincia.Items.Count == 0)
                {
                    ddlProvincia.DataSource = null;
                    ddlProvincia.Items.Clear();
                    ddlDepartamento.DataSource = null;
                    ddlDepartamento.Items.Clear();
                }
                else
                {
                    int codProvincia = Convert.ToInt32(ddlProvincia.SelectedValue);
                    CargarDepartamentos(codProvincia);
                }
            }
            catch (Exception ex)
            {
                lblError.Text = "Hubo un problema al cargar las provincias";
                lblMensajeError.Text = ex.Message;
                //Console.Write("ERROR: " + ex.Message);
            }
        }
        private void CargarDepartamentos(int pCodProvincia)
        {
            try
            {
                gDepartamentos = new GestorDepartamentos();
                ddlDepartamento.DataSource = gDepartamentos.ObtenerTodos(pCodProvincia);
                ddlDepartamento.DataTextField = "nombre";
                ddlDepartamento.DataValueField = "idDepartamento";
                ddlDepartamento.DataBind();
                ddlDepartamento.Items.Insert(0, new ListItem("<Seleccione un Item>", "0"));
                if (ddlDepartamento.Items.Count != 0)
                {
                    int codDepartamento = Convert.ToInt32(ddlDepartamento.SelectedValue);
                    CargarCiudades(codDepartamento);
                }
                else
                {
                    ddlLocalidad.DataSource = null;
                    ddlDepartamento.DataSource = null;
                    ddlLocalidad.Items.Clear();
                    ddlDepartamento.Items.Clear();
                }
            }
            catch (Exception ex)
            {
                lblError.Text = "Hubo un problema al cargar los departamentos";
                lblMensajeError.Text = ex.Message;
                //Console.Write("ERROR: " + ex.Message);
            }
        }
        private void CargarCiudades(int pCodDepartamento)
        {
            try
            {
                gLocalidades = new GestorLocalidades();
                ddlLocalidad.DataSource = gLocalidades.ObtenerTodos(pCodDepartamento);
                ddlLocalidad.DataTextField = "nombre";
                ddlLocalidad.DataValueField = "idLocalidad";
                ddlLocalidad.DataBind();
                ddlLocalidad.Items.Insert(0, new ListItem("<Seleccione un Item>", "0"));
                if (ddlLocalidad.Items.Count == 0)
                {
                    ddlLocalidad.Items.Clear();
                    ddlLocalidad.DataSource = null;
                }
                else
                {
                    int codLocalidad = Convert.ToInt32(ddlLocalidad.SelectedValue);
                    CargarBarrios(codLocalidad);
                }

            }
            catch (Exception ex)
            {
                lblError.Text = "Hubo un problema al cargar las localidades";
                lblMensajeError.Text = ex.Message;
                //Console.Write("ERROR: " + ex.Message);
            }
        }
        private void CargarBarrios(int pCodLocalidad)
        {
            try
            {
                gBarrios = new GestorBarrios();
                ddlBarrio.DataSource = gBarrios.ObtenerTodos(pCodLocalidad);
                ddlBarrio.DataTextField = "nombre";
                ddlBarrio.DataValueField = "idBarrio";
                ddlBarrio.DataBind();
                ddlBarrio.Items.Insert(0, new ListItem("<Seleccione un Item>", "0"));
                if (ddlBarrio.Items.Count == 0)
                {
                    ddlBarrio.Items.Clear();
                    ddlBarrio.DataSource = null;
                }
            }
            catch (Exception ex)
            {
                //lblError.Text = "Hubo un problema al cargar los barrios "+ex.Message;
                lblError.Text = ex.Message;
                lblMensajeError.Text = ex.Message;
            }
        }
        protected void ddlProvincia_SelectedIndexChanged(object sender, EventArgs e)
        {
            int codProvincia = Convert.ToInt32(ddlProvincia.SelectedValue.ToString());
            CargarDepartamentos(codProvincia);
        }
        protected void ddlDepartamento_SelectedIndexChanged(object sender, EventArgs e)
        {
            int codDepartamento = Convert.ToInt32(ddlDepartamento.SelectedValue.ToString());
            CargarCiudades(codDepartamento);
        }
        protected void ddlLocalidad_SelectedIndexChanged(object sender, EventArgs e)
        {
            int codLocalidad = Convert.ToInt32(ddlLocalidad.SelectedValue.ToString());
            CargarBarrios(codLocalidad);
        }
        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            Response.Redirect("~/Default.aspx");
        }
        private void Habilitar(string operacion)
        {
            switch (operacion)
            {
                case "cons":
                    this.Page.Title = "Consulta de Clientes";
                    btbAceptar.Visible = false;
                    string id = Request.QueryString["idcliente"].ToString();
                    int idCli = int.Parse(id);
                    CargarDatos(operacion, idCli);
                    presentarForm(operacion);
                    break;
                case "buscar":
                    this.Page.Title = "Busqueda de Clientes";
                    btbAceptar.Visible = false;
                    string idb = Request.QueryString["idcliente"].ToString();
                    int idClib = int.Parse(idb);
                    CargarDatos(operacion, idClib);
                    presentarForm(operacion);
                    break;
                case "nuevo":
                    this.Page.Title = "Alta de Clientes";
                    btbAceptar.Visible = true;
                    btbAceptar.Text = "Registrar";
                    presentarForm(operacion);
                    break;
                case "baja":
                    this.Page.Title = "Baja de Clientes";
                    btbAceptar.Visible = true;
                    btbAceptar.Text = "Baja";
                    string idc = Request.QueryString["idcliente"].ToString();
                    int idClie = int.Parse(idc);
                    CargarDatos(operacion, idClie);
                    presentarForm(operacion);
                    break;
                case "modif":
                    this.Page.Title = "Modificacion de Clientes";
                    btbAceptar.Visible = true;
                    btbAceptar.Text = "Modificar";
                    string idCliente = Request.QueryString["idcliente"].ToString();
                    int oIdCliente = int.Parse(idCliente);
                    CargarDatos(operacion, oIdCliente);
                    presentarForm(operacion);
                    break;
            }
        }
        private void CargarDatos(string op, int idCli)
        {
            try
            {
                gClientes = new GestorClientes();
                gDomicilios = new GestorDomicilios();
                gProvincias = new GestorProvincias();
                Domicilio d = null;
                Provincia pcia = null;
                Departamento dpto = null;
                Localidad city = null;
                Barrio b = null;
                Cliente c = gClientes.BuscarPorId(idCli);
                if (c != null)
                {
                    d = gDomicilios.BuscarPorId(c.IdDomicilio);
                    b = gBarrios.BuscarPorId(d.IdBarrio);
                    city = gLocalidades.BuscarPorId(b.IdLocalidad);
                    dpto = gDepartamentos.BuscarPorId(city.IdDepartamento);
                    pcia = gProvincias.BuscarPorId(dpto.IdProvincia);
                    Session["clienteSeleccionado"] = c;
                    Session["domicilioClienteSeleccionado"] = d;
                    hfDatos.Value = idCli.ToString();
                    txtNombre.Text = c.Nombre;
                    txtApellido.Text = c.Apellido;
                    txtCalle.Text = d.Calle;
                    txtNroDocumento.Text = c.NroDocumento.ToString();
                    txtAltura.Text = d.Nro.ToString();
                    if (c.TelCelular != null)
                    {
                        txtTelCelular.Text = c.TelCelular.ToString();
                    }
                    if (c.TelFijo != null)
                    {
                        txtTelFijo.Text = c.TelFijo.ToString();
                    }
                    if (c.Email != null)
                    {
                        txtEmail.Text = c.Email;
                    }
                    ddlProvincia.SelectedValue = pcia.IdProvincia.ToString();
                    CargarDepartamentos(pcia.IdProvincia);
                    ddlDepartamento.SelectedValue = dpto.IdDepartamento.ToString();
                    CargarCiudades(dpto.IdDepartamento);
                    ddlLocalidad.SelectedValue = city.IdLocalidad.ToString();
                    CargarBarrios(city.IdLocalidad);
                    ddlBarrio.SelectedValue = d.IdBarrio.ToString();
                    ddlTipoDocumento.SelectedValue = c.IdTipoDocumento.ToString();
                }
            }
            catch (Exception ex)
            {
                lblMensajeError.Text = ex.Message;
            }
        }

        protected void btbAceptar_Click(object sender, EventArgs e)
        {
            switch (op)
            {
                case "nuevo": Registrar();
                    break;
                case "modif":
                    Modificar();
                    break;
                case "baja":
                    Eliminar();
                    break;
            }
        }
        private void Registrar()
        {
            try
            {
                //Aca deberia ir Transaction por si las dudas
                Cliente cli = new Cliente();
                cli.Apellido = txtApellido.Text;
                cli.Nombre = txtNombre.Text;
                cli.NroDocumento = int.Parse(txtNroDocumento.Text);

                Domicilio dom = new Domicilio();
                dom.Calle = txtCalle.Text;
                dom.IdBarrio = Convert.ToInt32(ddlBarrio.SelectedValue); ;
                dom.Nro = int.Parse(txtAltura.Text);
                gDomicilios = new GestorDomicilios();
                int idDom = -1;
                gDomicilios.RegistrarDomicilio(dom, out idDom);
                cli.IdDomicilio = idDom;//gDomicilios.ObtenerUltimoID();
                cli.IdTipoDocumento = int.Parse(ddlTipoDocumento.SelectedValue.ToString());
                cli.TelFijo = int.Parse(txtTelFijo.Text);
                cli.TelCelular = int.Parse(txtTelCelular.Text);
                cli.Email = txtEmail.Text;

                gClientes = new GestorClientes();
                int sFilas = -1;
                gClientes.RegistrarCliente(cli, out sFilas);
                if (sFilas > 0)
                {
                    lblError.Text = "Se registro correctamente el cliente";
                }
                else
                {
                    lblError.Text = "No se pudo registrar el cliente";
                }
            }
            catch (Exception ex)
            {
                lblMensajeError.Text = ex.Message;
            }
        }
        private void Modificar()
        {
            try
            {
                Cliente cli = null;
                if (Session["clienteSeleccionado"]!=null)
                {
                    cli = (Cliente)Session["clienteSeleccionado"];
                }
                else
                {
                    cli = new Cliente();
                }
                Domicilio dom = null;
                if (Session["domicilioClienteSeleccionado"] != null)
                {
                    dom = (Domicilio)Session["domicilioClienteSeleccionado"];                    
                }
                else
                {
                    dom = new Domicilio();
                }
                //Session["clienteSeleccionado"] = c;
                //Session["domicilioClienteSeleccionado"] = d;
                //Cliente cli = new Cliente();
                cli.Apellido = txtApellido.Text;
                cli.Nombre = txtNombre.Text;
                cli.NroDocumento = int.Parse(txtNroDocumento.Text);
                //Domicilio dom = new Domicilio();
                dom.Calle = txtCalle.Text;
                dom.IdBarrio = Convert.ToInt32(ddlBarrio.SelectedValue); ;
                dom.Nro = int.Parse(txtAltura.Text);
                gDomicilios = new GestorDomicilios();
                int idDom = -1;
                gDomicilios.RegistrarDomicilio(dom, out idDom);
                cli.IdDomicilio = dom.IdDomicilio;//gDomicilios.ObtenerUltimoID();
                cli.IdTipoDocumento = int.Parse(ddlTipoDocumento.SelectedValue.ToString());
                cli.IdCliente = int.Parse(hfDatos.Value);
                if (!string.IsNullOrEmpty(txtTelCelular.Text))
                    cli.TelCelular = Convert.ToInt32(txtTelCelular.Text);
                if (!string.IsNullOrEmpty(txtTelFijo.Text))
                    cli.TelFijo = Convert.ToInt32(txtTelFijo.Text);
                if (!string.IsNullOrEmpty(txtEmail.Text))
                    cli.Email = txtEmail.Text;
                gClientes = new GestorClientes();
                int sFilas = -1;
                gClientes.RegistrarCliente(cli, out sFilas);
                if (sFilas > 0)
                    lblError.Text = "Se modifico correctamente el cliente";
                else
                    lblError.Text = "No se pudo modificar el cliente";
            }
            catch (Exception ex)
            {
                lblMensajeError.Text = ex.Message;   
            }         
        }
        private void Eliminar()
        {
            try
            {
                 gClientes = new GestorClientes();
            Cliente cli = new Cliente();
            int idCliente = int.Parse(Request.QueryString["idcliente"].ToString());
            cli.IdCliente = idCliente;
            gClientes.EliminarCliente(cli);
            lblError.Text = "Se elimino correctamente";
            }
            catch (Exception ex)
            {
                lblMensajeError.Text = ex.Message;
            }
        }
        private void presentarForm(string opcForm)
        {
            switch (opcForm)
            {
                case "cons":
                    txtAltura.Enabled = false;
                    txtApellido.Enabled = false;
                    txtCalle.Enabled = false;
                    txtEmail.Enabled = false;
                    txtNombre.Enabled = false;
                    txtNroDocumento.Enabled = false;
                    txtTelCelular.Enabled = false;
                    txtTelFijo.Enabled = false;
                    ddlBarrio.Enabled = false;
                    ddlDepartamento.Enabled = false;
                    ddlLocalidad.Enabled = false;
                    ddlProvincia.Enabled = false;
                    ddlTipoDocumento.Enabled = false;
                    break;
                case "buscar":
                    txtAltura.Enabled = false;
                    txtApellido.Enabled = false;
                    txtCalle.Enabled = false;
                    txtEmail.Enabled = false;
                    txtNombre.Enabled = false;
                    txtNroDocumento.Enabled = false;
                    txtTelCelular.Enabled = false;
                    txtTelFijo.Enabled = false;
                    ddlBarrio.Enabled = false;
                    ddlDepartamento.Enabled = false;
                    ddlLocalidad.Enabled = false;
                    ddlProvincia.Enabled = false;
                    ddlTipoDocumento.Enabled = false;
                    break;
                case "nuevo":
                    txtAltura.Enabled = true;
                    txtApellido.Enabled = true;
                    txtCalle.Enabled = true;
                    txtEmail.Enabled = true;
                    txtNombre.Enabled = true;
                    txtNroDocumento.Enabled = true;
                    txtTelCelular.Enabled = true;
                    txtTelFijo.Enabled = true;
                    ddlBarrio.Enabled = true;
                    ddlDepartamento.Enabled = true;
                    ddlLocalidad.Enabled = true;
                    ddlProvincia.Enabled = true;
                    ddlTipoDocumento.Enabled = true;
                    break;
                case "baja":
                    txtAltura.Enabled = false;
                    txtApellido.Enabled = false;
                    txtCalle.Enabled = false;
                    txtEmail.Enabled = false;
                    txtNombre.Enabled = false;
                    txtNroDocumento.Enabled = false;
                    txtTelCelular.Enabled = false;
                    txtTelFijo.Enabled = false;
                    ddlBarrio.Enabled = false;
                    ddlDepartamento.Enabled = false;
                    ddlLocalidad.Enabled = false;
                    ddlProvincia.Enabled = false;
                    ddlTipoDocumento.Enabled = false;
                    break;
                case "modif":
                    txtAltura.Enabled = true;
                    txtApellido.Enabled = true;
                    txtCalle.Enabled = true;
                    txtEmail.Enabled = true;
                    txtNombre.Enabled = true;
                    txtNroDocumento.Enabled = true;
                    txtTelCelular.Enabled = true;
                    txtTelFijo.Enabled = true;
                    ddlBarrio.Enabled = true;
                    ddlDepartamento.Enabled = true;
                    ddlLocalidad.Enabled = true;
                    ddlProvincia.Enabled = true;
                    ddlTipoDocumento.Enabled = true;
                    break;
            }
        }
    }
}